package com.yhq.basic.thread;

/**
 * 业务场景
 * 传递参数：比如token
 * 线程隔离
 * 例如
 * ThreadLocal 在Spring事务中的应用
 * Spring 的事务借助了ThreadLocal类，Spring 回从数据库连接池中获得一个connection,
 * 然后把connection放进ThreadLocal中，也就和线程绑定了，事务提交或回滚，只要从ThreadLocal中拿到connection进行操作
 *
 * ThreadLocal 设计
 *
 * Map<ThreadLocal,value>，其中key是弱引用
 * 内存泄漏的根本原因，没有使用remove，移除entry
 *
 * hash 冲突 解决办法：使用线性探测法来解决hash冲突，线性探测法：往后移动，找空位，若移动到尾部还是没有空位，会从0位置开始再次循环
 * 不会陷入死循环，原因：ThreadLocal每次插入都会判断容量是否够，会进行扩容
 *
 * @author hqyin
 * @date 2025/5/5 1:32 PM
 *
 */
public class TestThreadLocal {
    public static void main(String[] args) throws InterruptedException {
        //ThreadLocal get set方法
        testGetAndSet();
        //synchronized 与 ThreadLocal 区别

        Thread.sleep(10000);
    }

    private ThreadLocal<String> content = new ThreadLocal<>();

    public String getContent() {
        return content.get();
    }

    public void setContent(String content) {
        this.content.set(content);
    }



    private static void testGetAndSet() {
        TestThreadLocal demo = new TestThreadLocal();

        for (int i = 0; i < 5; i++) {
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {

                    demo.setContent(Thread.currentThread().getName());
                    System.out.println(Thread.currentThread().getName()+"======>"+demo.getContent());
                }
            });

            thread.start();
        }
    }
}
